#pragma once

#include "mbt/tracker.hh"

class EDFTracker: public TrackerBase {
public:
	EDFTracker(const cv::Matx33f& K, std::vector<Object3D*>& objects);

protected:
	void ComputeJac(Object3D* object, int m_id, const cv::Mat& frame,  const cv::Mat& mask_map, const cv::Mat& depth_map, const cv::Mat& depth_inv_map, const cv::Mat& dt_map, cv::Matx66f& wJTJM, cv::Matx61f& JTM);

	virtual void Track(std::vector<cv::Mat>& imagePyramid, std::vector<Object3D*>& objects, int runs = 1) override;
	void RunIteration(std::vector<Object3D*>& objects, const std::vector<cv::Mat>& imagePyramid, int level);
	void Backproject(std::vector<cv::Point>& pt2ds, cv::Mat& depth_map, std::vector<cv::Vec3f>& pt3ds);
	//void DetectEdge(const cv::Mat& img, cv::Mat& edge_map);
	void Filter(const cv::Mat& bgrImg, const cv::Mat& grayImg, cv::Mat cannyImg, cv::Mat& filteredEdge);
	void FilterEdge(const cv::Rect& roi, const cv::Mat& frame, const cv::Mat& edge_map, cv::Mat& wc_map);
	void FindContours(const cv::Mat& projection_mask, int seg, bool all_contours, std::vector<cv::Point>& ctr_pts);
	void ComputeDistanceTransform(cv::Mat& edge_map, cv::Mat& dt_map);

protected:
};